const tencentcloud = require('tencentcloud-sdk-nodejs');
const AsrClient = tencentcloud.asr.v20190614.Client;
const logger = require('../utils/logger');
const config = require('../config');

/**
 * 语音识别服务
 * 使用腾讯云ASR服务进行语音转文本
 */
class AsrService {
  constructor() {
    this.client = null;
    this.initialized = false;
  }

  /**
   * 初始化语音识别服务
   */
  init() {
    try {
      // 检查配置
      if (!config.tencentCloud.secretId || !config.tencentCloud.secretKey) {
        logger.warn('腾讯云API密钥未配置，语音识别服务未初始化');
        return;
      }

      // 创建ASR客户端
      const clientConfig = {
        credential: {
          secretId: config.tencentCloud.secretId,
          secretKey: config.tencentCloud.secretKey,
        },
        region: config.tencentCloud.region,
        profile: {
          httpProfile: {
            endpoint: "asr.tencentcloudapi.com",
          },
        },
      };

      this.client = new AsrClient(clientConfig);
      this.initialized = true;
      logger.info('语音识别服务初始化成功');
    } catch (error) {
      logger.error(`语音识别服务初始化失败: ${error.message}`);
    }
  }

  /**
   * 检查服务是否已初始化
   * @returns {boolean} 是否已初始化
   */
  isInitialized() {
    return this.initialized && this.client !== null;
  }

  /**
   * 将音频文件转换为文本
   * @param {string} audioUrl - 音频文件URL或Base64编码
   * @param {Object} options - 识别选项
   * @returns {Promise<string>} 识别结果文本
   */
  async recognizeSpeech(audioUrl, options = {}) {
    if (!this.isInitialized()) {
      throw new Error('语音识别服务未初始化');
    }

    try {
      // 准备请求参数
      const params = {
        EngineType: options.engineType || config.asr.engineType,
        ChannelNum: options.channelNum || 1,
        ResTextFormat: options.resTextFormat || 0,
        SourceType: options.sourceType || 0,
      };

      // 根据音频来源类型设置参数
      if (params.SourceType === 0) {
        // URL方式
        params.Url = audioUrl;
      } else if (params.SourceType === 1) {
        // Base64编码
        params.Data = audioUrl;
      } else {
        throw new Error('不支持的音频来源类型');
      }

      // 发送识别请求
      logger.debug('发送语音识别请求');
      const response = await this.client.SentenceRecognition(params);

      // 处理响应
      if (response && response.Result) {
        logger.debug(`语音识别成功: ${response.Result}`);
        return response.Result;
      } else {
        logger.warn('语音识别结果为空');
        return '';
      }
    } catch (error) {
      logger.error(`语音识别失败: ${error.message}`);
      throw error;
    }
  }

  /**
   * 执行实时语音识别
   * @param {Buffer} audioBuffer - 音频数据缓冲区
   * @param {Object} options - 识别选项
   * @returns {Promise<string>} 识别结果文本
   */
  async recognizeRealtime(audioBuffer, options = {}) {
    if (!this.isInitialized()) {
      throw new Error('语音识别服务未初始化');
    }

    try {
      // 将音频缓冲区转换为Base64
      const base64Audio = audioBuffer.toString('base64');
      
      // 准备请求参数
      const params = {
        EngineType: options.engineType || config.asr.engineType,
        ChannelNum: options.channelNum || 1,
        ResTextFormat: options.resTextFormat || 0,
        SourceType: 1, // 使用Base64编码
        Data: base64Audio,
        VoiceFormat: options.voiceFormat || 'wav', // 音频格式
        FilterDirty: options.filterDirty || 0, // 是否过滤脏话
        FilterModal: options.filterModal || 0, // 是否过滤语气词
        FilterPunc: options.filterPunc || 0, // 是否过滤标点符号
      };

      // 发送识别请求
      logger.debug('发送实时语音识别请求');
      const response = await this.client.SentenceRecognition(params);

      // 处理响应
      if (response && response.Result) {
        logger.debug(`实时语音识别成功: ${response.Result}`);
        return response.Result;
      } else {
        logger.warn('实时语音识别结果为空');
        return '';
      }
    } catch (error) {
      logger.error(`实时语音识别失败: ${error.message}`);
      throw error;
    }
  }
}

// 导出单例
module.exports = new AsrService();